#include "buffer.h"
#include <QDebug>
#include <QString>
#include <iostream>
Buffer::Buffer(QObject *parent) :
    QObject(parent)
{

}

Buffer::Buffer(int bufferSize,int totalProdutos):bufferSize(bufferSize),totalProdutos(totalProdutos){
	this->semaforoLivres = new QSemaphore(bufferSize);
        this->semaforoUsados = new QSemaphore(0);
       // this->semaforoLivres = new QSemaphore(0);
	this->mutex = new QMutex();
        this->mutex2 = new QMutex();
    this->mutex3 = new QMutex();
        this->totalLeitoresRodada =0;
        this->vetor= new int[bufferSize];
        for(int i=0;i<bufferSize;i++){
                vetor[i]=0;
        }
        this->posicaoEscreve=0;
        this->leiturasMultiplas=0;
        this->posicaoLe=0;
        this->countLabelacao=0;
        this->countLabelSemaforos=0;
        this->totalProdutosPraLeitura=totalProdutos;

}
int Buffer::escreve(int dado){
        if(totalProdutos!=0){
                int ant=posicaoEscreve;
                vetor[posicaoEscreve]=dado;
                posicaoEscreve=(posicaoEscreve+1)%bufferSize;
                totalProdutos--;
							QMutex mutexEsperaTratarSinal;
			//          mutexEsperaTratarSinal.lock();
                emit mudouBuffer(vetor,ant,&mutexEsperaTratarSinal);
						 //   mutexEsperaTratarSinal.lock();
                return 0;

        }
        else
                return 1;


}
int Buffer::le(int i){
    QMutex mutexEsperaTratarSinal;
    emit leuBuffer(vetor,i,&mutexEsperaTratarSinal);
    }

int Buffer::le(){
        int tmp;
        if (totalProdutosPraLeitura!=0){
        tmp = vetor[posicaoLe];
        totalProdutosPraLeitura--;
        int ant=posicaoLe;
        //qDebug()<<ant<<" ";
        posicaoLe=(posicaoLe +1)%bufferSize;
				QMutex mutexEsperaTratarSinal;
		//    mutexEsperaTratarSinal.lock();
        emit leuBuffer(vetor,ant,&mutexEsperaTratarSinal);
        //sleep(1);
		//    mutexEsperaTratarSinal.lock();
        return tmp;
        }
        return -1;
}
void Buffer::showStatus(){
        QString palavra=QString(" ");
        for(int i=0;i<bufferSize;i++){
                palavra+=palavra.number(vetor[i]);
                palavra+=" ";
        }
        palavra+="\n";
        qDebug()<<palavra;
        std::cout<<palavra.toStdString()<<endl;

}


//void Buffer::setLabelSaida(QLabel * label){
//    this->labelSaida=label;
//    this->labelSaida->setAlignment(Qt::AlignTop|Qt::AlignLeft);
//    label->setText(QString(" "));

//}
//void Buffer::setSaidaDoLabel(QString a){
//    if (countLabelacao>5){
//        this->labelSaida->setText(QString(" "));
//        countLabelacao=0;
//    }
//    labelSaida->setText(this->labelSaida->text()+"\n"+a+"\n");
//    countLabelacao++;
//}
void Buffer::setLabelSemaphoros(QLabel * label){
		this->labelSemaforos=label;
		this->labelSemaforos->setAlignment(Qt::AlignTop|Qt::AlignLeft);
		this->labelSemaforos->setText(QString(" "));
}
void Buffer::setSaidaDoLabelSemaforos(QString a){
                std::cout<<a.toStdString()<<endl;
                if (countLabelSemaforos>15){
                                this->labelSemaforos->setText(QString(" "));
        countLabelSemaforos=0;
    }
                labelSemaforos->setText(this->labelSemaforos->text()+a+"\n");
                countLabelSemaforos++;

}
